package com.gaga.common.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @DESCRIPTION:
 * @USER: ningxiang
 * @DATE: 5/2/2025 10:06 PM
 */
public class NumberConverter {
    // 定义阿拉伯数字到中文数字的映射
    private static final char[] CN_DIGITS = {'零', '一', '二', '三', '四', '五', '六', '七', '八', '九'};
    // 智能转换模式（支持数值组合）
    private static final String[] CN_UNITS = {"", "十", "百", "千"};
    private static final String[] LARGE_UNITS = {"", "万", "亿"};


    public static String convertArabicToChinese(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        StringBuilder result = new StringBuilder();
        for (char c : input.toCharArray()) {
            if (Character.isDigit(c)) {
                int index = c - '0'; // 计算数字对应的索引
                result.append(CN_DIGITS[index]);
            } else {
                result.append(c); // 非数字字符直接保留
            }
        }
        return result.toString();
    }

    public static String convertAmountInText(String text) {
        // 正则匹配数字格式（支持小数）
        Pattern pattern = Pattern.compile("(\\d+\\.\\d+)|(\\d+)");
        Matcher matcher = pattern.matcher(text);

        StringBuffer result = new StringBuffer();
        while (matcher.find()) {
            String number = matcher.group();
            String chinese = convertNumber(number);
            matcher.appendReplacement(result, chinese);
        }
        matcher.appendTail(result);

        return result.toString();
    }

    private static String convertNumber(String number) {
        if (number == null || number.isEmpty()) {
            return number;
        }
        if (isYear(number)) {
            return number;
        }
        String[] parts = number.split("\\.");
        StringBuilder result = new StringBuilder();

        // 转换整数部分
        result.append(convertIntegerPart(parts[0]));

        // 转换小数部分
        if (parts.length > 1) {
            result.append("点").append(convertDecimalPart(parts[1]));
        }

        return result.toString();
    }

    public static boolean isYear(String str) {
        // 匹配4位数字，范围通常在1000-2999（可根据需求调整）
        return str != null && str.matches("^(20)\\d{2}$");
    }

    // 转换整数部分
    private static String convertIntegerPart(String integerPart) {
        if (integerPart.equals("0")) return String.valueOf(CN_DIGITS[0]);

        StringBuilder result = new StringBuilder();
        int sectionPos = 0;
        boolean needZero = false;

        // 从低位到高位处理（字符串反转处理）
        char[] digits = new StringBuilder(integerPart).reverse().toString().toCharArray();

        for (int i = 0; i < digits.length; i++) {
            int digit = Character.getNumericValue(digits[i]);

            // 当前位的位置（0=个位，1=十位，2=百位，3=千位）
            int pos = i % 4;

            if (digit != 0) {
                if (needZero) {
                    result.append(CN_DIGITS[0]);
                    needZero = false;
                }
                result.append(CN_UNITS[pos]).append(CN_DIGITS[digit]);
            } else {
                needZero = (result.length() > 0 && !needZero);
            }

            // 每四位处理一次节单位
            if (pos == 3 || i == digits.length - 1) {
                if (result.length() > 0) {
                    result.append(LARGE_UNITS[sectionPos]);
                    needZero = false;
                }
                sectionPos = (sectionPos + 1) % 3;
            }
        }

        // 处理结果反转并清理多余的零
        return result.reverse().toString()
                .replaceAll("零+([万亿])", "$1")
                .replaceAll("零+", "零")
                .replaceAll("^零", "")
                .replaceAll("^一十", "十");
    }

    // 转换小数部分
    private static String convertDecimalPart(String decimalPart) {
        StringBuilder result = new StringBuilder();
        for (char c : decimalPart.toCharArray()) {
            int digit = Character.getNumericValue(c);
            result.append(CN_DIGITS[digit]);
        }
        return result.toString();
    }

    public static void main(String[] args) {
        String test1 = "2024年5月20日";
        System.out.println(convertAmountInText(test1)); // 输出：二零二四年五月二零日

        String test2 = ".今天.45元";
        System.out.println(convertAmountInText(test2)); // 输出：电话：一二三四五六七八九
    }
}
